/* #include <stdio.h>
#include <signal.h>
#include <unistd.h>

// 自定义的信号处理函数
void sigint_handler(int signum) {
    printf("Caught SIGINT signal. I won't terminate immediately!\n");
}

int main() {
    struct sigaction act;
    // 初始化sa_handler为自定义的信号处理函数
    act.sa_handler = sigint_handler;
    // 清空信号掩码，即不额外阻塞其他信号
    sigemptyset(&act.sa_mask); 
    // 设置sa_flags为0，使用默认选项
    act.sa_flags = 0; 

    // 注册SIGINT信号的处理函数
    if (sigaction(SIGINT, &act, NULL) == -1) {
        perror("sigaction");
        return 1;
    }

    while (1) {
        printf("Program is running...\n");
        sleep(1);
    }
    return 0;
} */

/* #include<iostream>
#include<signal.h>
#include<unistd.h>
void handle(int n)
{
    std::cout<<"进程["<<getpid()<<"]捕获了"<<n<<"号信号"<<std::endl;
    sleep(1);
}
int main()
{
    //将SIGKILL信号捕捉
    signal(SIGKILL,handle);
    while(1)
    {
        std::cout<<getpid()<<"Im runnig....."<<std::endl;
        sleep(1);
    }
    return 0;
} */

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <sys/wait.h>
#include <cstring>
// 子进程数量，命名更语义化
static int child_process_count = 5;  

// 更明确的函数名，表明是SIGCHLD信号的处理函数
void sigchld_handler(int signum) {  
    int n;
    // 循环回收已退出的子进程
    while ((n = waitpid(-1, NULL, WNOHANG)) > 0) {  
        std::cout << "回收了一个子进程 PID:" << n << std::endl;
    }
    if (n < 0) {
        std::cout << "wait fail!" << std::endl;
        char* error=strerror(errno);
        std::cout<<"reason:"<<error<<std::endl;
    }
    // n == 0 时无需处理，可根据需求决定是否打印提示
}

int main() {
    struct sigaction sa;
    sa.sa_handler = sigchld_handler;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;
    // 使用sigaction更健壮地注册信号处理
    if (sigaction(SIGCHLD, &sa, NULL) == -1) {  
        std::cerr << "sigaction error" << std::endl;
        return 1;
    }

    for (int i = 0; i < child_process_count; i++) {
        pid_t id = fork();
        if (id < 0) {
            // 处理fork失败情况
            std::cerr << "fork error, i = " << i << std::endl; 
            continue;
        } else if (id == 0) {
            std::cout << "子进程 PID[" << getpid() << "] 开始运行" << std::endl;
            sleep(3);
            std::cout << "子进程 PID[" << getpid() << "] 退出" << std::endl;
            // 子进程退出
            return 0; 
        }
    }

    std::cout << "父进程 PID[" << getpid() << "]开始运行" << std::endl;
    while (1) {
        // 适当休眠，降低CPU消耗，可根据实际情况调整休眠时间
        sleep(1); 
    }
    return 0;
}